home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 7: Sunsite / Linux Cubed Series 7 - Sunsite Vol 1.iso / system / news / inn1.000 / inn1.4sec-linux-src.tar / inn / innd / inndstart.c < prev    next >
C/C++ Source or Header  |  1993-03-18  |  4KB  |  158 lines

  1. /*  $Revision: 1.10 $
  2. **
  3. **  Open the privileged port, then exec innd.
  4. */
  5. #include "configdata.h"
  6. #include <stdio.h>
  7. #include <sys/types.h>
  8. #include <sys/stat.h>
  9. #include <sys/socket.h>
  10. #include <netinet/in.h>
  11. #include <fcntl.h>
  12. #include "paths.h"
  13. #include "logging.h"
  14. #include "libinn.h"
  15. #include "clibrary.h"
  16. #include "macros.h"
  17. #if    NOFILE_LIMIT > 0
  18. #if    defined(DO_NEED_TIME)
  19. #include <time.h>
  20. #endif    /* defined(DO_NEED_TIME) */
  21. #include <sys/time.h>
  22. #include <sys/resource.h>
  23. #endif    /* NOFILE_LIMIT > 0 */
  24.  
  25. /* #define DEBUGGER "/usr/ucb/dbx" */
  26.  
  27.  
  28. #if    NOFILE_LIMIT > 0
  29. /*
  30. **  Set the limit on the number of open files we can have.  I don't
  31. **  like having to do this.
  32. */
  33. STATIC void
  34. SetDescriptorLimit(i)
  35.     int            i;
  36. {
  37.     struct rlimit    rl;
  38.  
  39.     if (getrlimit(RLIMIT_NOFILE, &rl) < 0) {
  40.     syslog(L_ERROR, "inndstart cant getrlimit(NOFILE) %m");
  41.     return;
  42.     }
  43.     rl.rlim_cur = i;
  44.     if (setrlimit(RLIMIT_NOFILE, &rl) < 0) {
  45.     syslog(L_ERROR, "inndstart cant setrlimit(NOFILE) %d %m", i);
  46.     return;
  47.     }
  48. }
  49. #endif    /* NOFILE_LIMIT > 0 */
  50.  
  51.  
  52. int
  53. main(ac, av)
  54.     int            ac;
  55.     char        *av[];
  56. {
  57.     static char        INNDDIR[] = _PATH_INNDDIR;
  58.     GID_T        NewsGID;
  59.     UID_T        NewsUID;
  60.     struct sockaddr_in    server;
  61.     register int    i;
  62.     register int    j;
  63. #if    defined(SO_REUSEADDR)
  64.     int            on;
  65. #endif    /* defined(SO_REUSEADDR) */
  66.     STRING        *argv;
  67.     char        *p;
  68.     char        pflag[SMBUF];
  69.     char        buff[BUFSIZ];
  70.     STRING        env[8];
  71.     struct stat        Sb;
  72.  
  73.     (void)openlog("inndstart", L_OPENLOG_FLAGS, LOG_INN_PROG);
  74.  
  75.     /* Make sure INND directory exists. */
  76.     if (stat(INNDDIR, &Sb) < 0 || !S_ISDIR(Sb.st_mode)) {
  77.     syslog(L_FATAL, "inndstart cant stat %s %m", INNDDIR);
  78.     exit(1);
  79.     }
  80.     NewsUID = Sb.st_uid;
  81.     NewsGID = Sb.st_gid;
  82.  
  83. #if    NOFILE_LIMIT > 0
  84.     SetDescriptorLimit(NOFILE_LIMIT);
  85. #endif    /* NOFILE_LIMIT > 0 */
  86.  
  87.     /* Create a socket and name it. */
  88.     if ((i = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
  89.     syslog(L_FATAL, "inndstart cant socket %m");
  90.     exit(1);
  91.     }
  92. #if    defined(SO_REUSEADDR)
  93.     on = 1;
  94.     if (setsockopt(i, SOL_SOCKET, SO_REUSEADDR, (caddr_t)&on, sizeof on) < 0)
  95.     syslog(L_ERROR, "inndstart cant setsockopt %m");
  96. #endif    /* defined(SO_REUSEADDR) */
  97.     (void)memset((POINTER)&server, 0, sizeof server);
  98.     server.sin_port = htons(NNTP_PORT);
  99.     server.sin_family = AF_INET;
  100.     server.sin_addr.s_addr = htonl(INADDR_ANY);
  101.     if (bind(i, (struct sockaddr *)&server, sizeof server) < 0) {
  102.     syslog(L_FATAL, "inndstart cant bind %m");
  103.     exit(1);
  104.     }
  105.     (void)sprintf(pflag, "-p%d", i);
  106.  
  107.     /* Build the new argument vector. */
  108.     argv = NEW(STRING, 2 + ac + 1);
  109.     j = 0;
  110. #if    defined(DEBUGGER)
  111.     argv[j++] = DEBUGGER;
  112.     argv[j++] = _PATH_INND;
  113.     argv[j] = NULL;
  114.     (void)printf("Use -dp%d\n", i);
  115. #else
  116.     argv[j++] = _PATH_INND;
  117.     argv[j++] = pflag;
  118.     for (i = 1; av[i]; )
  119.     argv[j++] = av[i++];
  120.     argv[j] = NULL;
  121. #endif    /* defined(DEBUGGER) */
  122.  
  123.     /* Set our user and group id. */
  124.     (void)setgid(NewsGID);
  125.     if (getgid() != NewsGID)
  126.     syslog(L_ERROR, "inndstart cant setgid to %d %m", NewsGID);
  127.     (void)setuid(NewsUID);
  128.     if (getuid() != NewsUID)
  129.     syslog(L_ERROR, "inndstart cant setuid to %d %m", NewsUID);
  130.  
  131.     /* Set up the environment. */
  132.     (void)sprintf(buff, "PATH=%s:%s:/bin:/usr/bin:/usr/ucb",
  133.         _PATH_NEWSBIN, _PATH_NEWSLIB);
  134.     env[0] = COPY(buff);
  135.     (void)sprintf(buff, "TMPDIR=%s", _PATH_TMP);
  136.     env[1] = COPY(buff);
  137.     (void)sprintf(buff, "SHELL=%s", _PATH_SH);
  138.     env[2] = COPY(buff);
  139.     (void)sprintf(buff, "LOGNAME=%s", NEWSMASTER);
  140.     env[3] = COPY(buff);
  141.     (void)sprintf(buff, "USER=%s", NEWSMASTER);
  142.     env[4] = COPY(buff);
  143.     (void)sprintf(buff, "HOME=%s", _PATH_NEWSLIB);
  144.     env[5] = COPY(buff);
  145.     i = 6;
  146.     if ((p = getenv("TZ")) != NULL) {
  147.     (void)sprintf(buff, "TZ=%s", p);
  148.     env[i++] = COPY(buff);
  149.     }
  150.     env[i++] = NULL;
  151.  
  152.     /* Go exec innd. */
  153.     (void)execve(argv[0], (CSTRING *)argv, (CSTRING *)env);
  154.     syslog(L_FATAL, "inndstart cant exec %s %m", argv[0]);
  155.     _exit(1);
  156.     /* NOTREACHED */
  157. }
  158.